﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BussinesLayer.Clases;
using CustomControl;

namespace Aplicacion.Inventario.Cruce
{
    public partial class frmCorteGeneral : Form
    {
        /// <summary>
        /// Obtiene o establece el valor que indica si se carga el corte pendiente o no.
        /// </summary>
        public bool CortePendiente { set; get; }

        /// <summary>
        /// Objeto de logica de negocio de Inventario.
        /// </summary>
        private BussinesInventario miBussinesInventario;

        /// <summary>
        /// Obtiene o establece el valor de id del orden asignado
        /// </summary>
        private int idOrden { set; get; }

        /// <summary>
        /// Objeto para la manipulacion de criterios de orden.
        /// </summary>
        private CriterioOrden miCriterioOrden;

        /// <summary>
        /// Obtiene o establece el valor de registro inicial de consulta de Inventario.
        /// </summary>
        private int rowInventario;

        /// <summary>
        /// Obtiene o establece el total de registros a recuperar.
        /// </summary>
        private int rowMaxInventario;

        /// <summary>
        /// Obtiene o establece el total de registros que representan el inventario.
        /// </summary>
        private long totalRowInventario;

        /// <summary>
        /// Obtiene o establece el total de paginas que se generan en el DataGridView.
        /// </summary>
        private long paginasInventario;

        /// <summary>
        /// Obtiene o establece la pagina actual en la cual se encuentran los registros del Inventario en el Grid.
        /// </summary>
        private int currentPageInventario;

        /// <summary>
        /// Inicaliza una nueva instancia de frmCorteGeneral.
        /// </summary>
        public frmCorteGeneral()
        {
            InitializeComponent();
            miBussinesInventario = new BussinesInventario();
            miCriterioOrden = new CriterioOrden();
            rowMaxInventario = 15;
        }

        private void frmCorteGeneral_Load(object sender, EventArgs e)
        {
            cbOrden.DataSource = miCriterioOrden.ListaOrden;
            if (CortePendiente)
            {
                CargarCorteGeneral();
            }
            else
            {
                CargarResumenInventario();
            }
            //MostrarRegistrosSinInventario();
        }

        private void frmCorteGeneral_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Escape)
            {
                this.Close();
            }
        }

        private void tsBtnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cbOrden_SelectionChangeCommitted(object sender, EventArgs e)
        {
            var id = Convert.ToInt32(cbOrden.SelectedValue);
            RecargarGridInventario(id);
        }

        private void btnInicioRowInventario_Click(object sender, EventArgs e)
        {
            if (currentPageInventario > 1)
            {
                var paginaActual = currentPageInventario;
                for (int i = paginaActual; i > 1; i--)
                {
                    rowInventario = rowInventario - rowMaxInventario;
                    currentPageInventario--;
                }
                try
                {
                    if (CortePendiente)
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaCorteGeneral
                            (idOrden, rowInventario, rowMaxInventario);
                        MostrarRegistrosSinInventario();
                    }
                    else
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaResumenInventario
                            (idOrden, rowInventario, rowMaxInventario);
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                lblStatusInventario.Text = currentPageInventario + " / " + paginasInventario;
            }
        }

        private void btnAnterior_Click(object sender, EventArgs e)
        {
            if (currentPageInventario > 1)
            {
                rowInventario = rowInventario - rowMaxInventario;
                if (rowInventario <= 0)
                    rowInventario = 0;
                try
                {
                    if (CortePendiente)
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaCorteGeneral
                            (idOrden, rowInventario, rowMaxInventario);
                        MostrarRegistrosSinInventario();
                    }
                    else
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaResumenInventario
                            (idOrden, rowInventario, rowMaxInventario);
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                currentPageInventario--;
                lblStatusInventario.Text = currentPageInventario + " / " + paginasInventario;
            }
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            ///Avanza a la pagina siguiente de la actual
            if (currentPageInventario < paginasInventario)
            {
                rowInventario = rowInventario + rowMaxInventario;
                try
                {
                    if (CortePendiente)
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaCorteGeneral
                            (idOrden, rowInventario, rowMaxInventario);
                        MostrarRegistrosSinInventario();
                    }
                    else
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaResumenInventario
                            (idOrden, rowInventario, rowMaxInventario);
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                currentPageInventario++;
                lblStatusInventario.Text = currentPageInventario + " / " + paginasInventario;
            }
        }

        private void btnFinRowInventario_Click(object sender, EventArgs e)
        {
            if (currentPageInventario < paginasInventario)
            {
                var paginaActual = currentPageInventario;
                for (int i = paginaActual; i < paginasInventario; i++)
                {
                    rowInventario = rowInventario + rowMaxInventario;
                    currentPageInventario++;
                }
                try
                {
                    if (CortePendiente)
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaCorteGeneral
                            (idOrden, rowInventario, rowMaxInventario);
                        MostrarRegistrosSinInventario();
                    }
                    else
                    {
                        dgvInventario.DataSource = miBussinesInventario.ConsultaResumenInventario
                            (idOrden, rowInventario, rowMaxInventario);
                    }
                }
                catch (Exception ex)
                {
                    OptionPane.MessageError(ex.Message);
                }
                lblStatusInventario.Text = currentPageInventario + " / " + paginasInventario;
            }
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta del Corte de inventario pendiente.
        /// </summary>
        private void CargarCorteGeneral()
        {
            rowInventario = 0;
            currentPageInventario = 1;
            try
            {
                dgvInventario.AutoGenerateColumns = false;
                dgvInventario.DataSource = miBussinesInventario.ConsultaCorteGeneral(1, rowInventario, rowMaxInventario);
                idOrden = 1;
                MostrarRegistrosSinInventario();
                totalRowInventario = miBussinesInventario.GetRowsConsultaCorteGeneral();
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasInventario = totalRowInventario / rowMaxInventario;
            if (totalRowInventario % rowMaxInventario != 0)
                paginasInventario++;
            if (currentPageInventario > paginasInventario)
                currentPageInventario = 0;
            lblStatusInventario.Text = currentPageInventario + " / " + paginasInventario;
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta del resultado del inventario cruzado.
        /// </summary>
        private void CargarResumenInventario()
        {
            rowInventario = 0;
            currentPageInventario = 1;
            try
            {
                dgvInventario.AutoGenerateColumns = false;
                dgvInventario.DataSource = miBussinesInventario.ConsultaResumenInventario(1, rowInventario, rowMaxInventario);
                idOrden = 1;
                totalRowInventario = miBussinesInventario.GetRowsConsultaResumenInventario();
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
            paginasInventario = totalRowInventario / rowMaxInventario;
            if (totalRowInventario % rowMaxInventario != 0)
                paginasInventario++;
            if (currentPageInventario > paginasInventario)
                currentPageInventario = 0;
            lblStatusInventario.Text = currentPageInventario + " / " + paginasInventario;
        }

        /// <summary>
        /// Resalta los registro de los productos que no se encuentran en inventario.
        /// </summary>
        public void MostrarRegistrosSinInventario()
        {
            foreach (DataGridViewRow row in dgvInventario.Rows)
            {
                if(!Convert.ToBoolean(row.Cells["Estado"].Value))
                {
                    //row.DefaultCellStyle.ForeColor = System.Drawing.Color.Red;
                    row.DefaultCellStyle.BackColor = System.Drawing.Color.Silver;
                }
            }
        }

        /// <summary>
        /// Carga el Grid con el resultado de la consulta a inventario segun el orden especificado.
        /// </summary>
        /// <param name="id">Id de orden seleccionado.</param>
        private void RecargarGridInventario(int id)
        {
            rowInventario = 0;
            try
            {
                if (CortePendiente)
                {
                    dgvInventario.DataSource = miBussinesInventario.ConsultaCorteGeneral(id, rowInventario, rowMaxInventario);
                    MostrarRegistrosSinInventario();
                }
                else
                {
                    dgvInventario.DataSource = miBussinesInventario.ConsultaResumenInventario(id, rowInventario, rowMaxInventario);
                }
                idOrden = id;
            }
            catch (Exception ex)
            {
                OptionPane.MessageError(ex.Message);
            }
        }
    }

    /// <summary>
    /// Representa una clase para la estructura de Criterios de Orden.
    /// </summary>
    internal class CriterioOrden
    {
        /// <summary>
        /// Obtiene o establece la lista de opciones de criterio de orden.
        /// </summary>
        public List<Producto.Criterio> ListaOrden { set; get; }

        /// <summary>
        /// Inicializa una nueva instancia de la clase CriterioOrden.
        /// </summary>
        public CriterioOrden()
        {
            this.ListaOrden = new List<Producto.Criterio>();
            this.ListaOrden.Add
                (new Producto.Criterio
                {
                    Id = 1,
                    Nombre = "Codigo"
                });
            this.ListaOrden.Add
                (new Producto.Criterio
                {
                    Id = 2,
                    Nombre = "A - Z"
                });
            this.ListaOrden.Add(
                new Producto.Criterio
                {
                    Id = 3,
                    Nombre = "Z - A"
                });
        }
    }
}